<!DOCTYPE html>
<html lang="en">

<!-- Head tag -->
<head><meta name="generator" content="Hexo 3.8.0">

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!--Description-->

    

    
        <meta name="description" content="今天，我们来讲一下RTP包的解析：
一、环境
macos 平台
通过jrtplib发送数据
wireshark软件捕捉数据

二、RTP包结构这一块网上数据很多，可以自己先百度了解一下。https://blog.csdn.net/qq_31186123/article/details/8290698">
    

    <!--Author-->
    
        <meta name="author" content="Cyrus">
    

    <!--Open Graph Title-->
    
        <meta property="og:title" content="RTP详解">
    

    <!--Open Graph Description-->
    
        <meta property="og:description" content="今天，我们来讲一下RTP包的解析：
一、环境
macos 平台
通过jrtplib发送数据
wireshark软件捕捉数据

二、RTP包结构这一块网上数据很多，可以自己先百度了解一下。https://blog.csdn.net/qq_31186123/article/details/8290698">
    

    <!--Open Graph Site Name-->
        <meta property="og:site_name" content="Cyrus的技术空间">

    <!--Type page-->
    
        <meta property="og:type" content="article">
    

    <!--Page Cover-->
    
    
        <meta property="og:image" content="http://cyrus_huang.gitee.io/bloghttp://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg">
    

        <meta name="twitter:card" content="summary_large_image">

    

    
        <meta name="twitter:image" content="http://cyrus_huang.gitee.io/bloghttp://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg">
    

    <!-- Title -->
    
    <title>RTP详解 - Cyrus的技术空间</title>

    <!-- Bootstrap Core CSS -->
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link rel="stylesheet" href="/blog/css/style.css">

    <!-- Custom Fonts -->
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
    <script src="//oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <!-- Gallery -->
    <link href="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.css" type="text/css" rel="stylesheet">

    <!-- Google Analytics -->
    


    <!-- favicon -->
    

</head>


<body>

    <!-- Menu -->
    <!-- Navigation -->
<nav class="navbar navbar-default navbar-custom navbar-fixed-top">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header page-scroll">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/blog/">Cyrus的技术空间</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                
                    <li>
                        <a href="/blog/">
                            
                                Home
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/archives">
                            
                                Archives
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/tags">
                            
                                Tags
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/categories">
                            
                                Categories
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="https://github.com/klugjo/hexo-theme-clean-blog">
                            
                                <i class="fa fa-github fa-stack-2x"></i>
                            
                        </a>
                    </li>
                
            </ul>
        </div>
        <!-- /.navbar-collapse -->
    </div>
    <!-- /.container -->
</nav>

    <!-- Main Content -->
    <!-- Page Header -->
<!-- Set your background image for this header in your post front-matter: cover -->

<header class="intro-header" style="background-image: url('http://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg')">
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <h1>RTP详解</h1>
                    
                    <span class="meta">
                        <!-- Date and Author -->
                        
                            Posted by Cyrus on
                        
                        
                            2020-07-02
                        
                    </span>
                </div>
            </div>
        </div>
    </div>
</header>

<!-- Post Content -->
<article>
    <div class="container">
        <div class="row">

            <!-- Tags and categories -->
           

            <!-- Gallery -->
            

            <!-- Post Main Content -->
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <p>今天，我们来讲一下RTP包的解析：</p>
<h3 id="一、环境"><a href="#一、环境" class="headerlink" title="一、环境"></a>一、环境</h3><ul>
<li>macos 平台</li>
<li>通过jrtplib发送数据</li>
<li>wireshark软件捕捉数据</li>
</ul>
<h3 id="二、RTP包结构"><a href="#二、RTP包结构" class="headerlink" title="二、RTP包结构"></a>二、RTP包结构</h3><p>这一块网上数据很多，可以自己先百度了解一下。<a href="https://blog.csdn.net/qq_31186123/article/details/82906987" target="_blank" rel="noopener">https://blog.csdn.net/qq_31186123/article/details/82906987</a> 像这篇就挺好的，这里就不重复了，就简单地放几张图吧。</p>
<h3 id="三、具体数据"><a href="#三、具体数据" class="headerlink" title="三、具体数据"></a>三、具体数据</h3><p>先放两张rtp结构图：<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/02/RTP详解/rtp_header.png" alt="rtp包头部结构"><br>先看第一组数据，使用jrtplib 的example1发送数据“1234567890”，发送端端口为5000， 接收端ip为127.0.0.1， 端口为4000.<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/02/RTP详解/rtp_1.png" alt=""><br>由于传输的负载是自定义的数据，所以wireshark没有识别出是rtp，但这并不影响我们的分析。</p>
<h4 id="1、首先先分析-rtp-header"><a href="#1、首先先分析-rtp-header" class="headerlink" title="1、首先先分析 rtp header:"></a>1、首先先分析 rtp header:</h4><p>80 00 2d cb 18 a8 ee f2 32 b8 51 db</p>
<p>对照上面的图片：</p>
<ul>
<li>80 –&gt; 10(V) 0(P) 0(X) 0000(CC)</li>
<li>V: RTP协议的版本号，占2位，当前协议版本号为2</li>
<li>P：填充标志，占1位，如果P=1，则在该报文的尾部填充一个或多个额外的八位组，它们不是有效载荷的一部分。 这里是0</li>
<li>X：扩展标志，占1位，如果X=1，则在RTP报头后跟有一个扩展报头，这里为0</li>
<li>CC：CSRC计数器，占4位，指示CSRC 标识符的个数，这是为0，表明没有CSRC,所以头部长度为12字节。</li>
</ul>
<p>*00 –&gt; 0(M) 000 0000(PT)</p>
<ul>
<li>M: 标记，占1位，不同的有效载荷有不同的含义，对于视频，标记一帧的结束；对于音频，标记会话的开始。 这是不是音视频数据，直接为0。</li>
<li><p>PT: 有效荷载类型，占7位，用于说明RTP报文中有效载荷的类型，如GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流的，这样便于客户端进行解析。这里是自定义的格式，为0（可以根据需求改成其他的，详见后面补充说明）</p>
</li>
<li><p>2d cb (序列号11723）</p>
</li>
<li><p>序列号：占16位，用于标识发送者所发送的RTP报文的序列号，每发送一个报文，序列号增1。这个字段当下层的承载协议用UDP的时候，网络状况不好的时候可以用来检查丢包。同时出现网络抖动的情况可以用来对数据进行重新排序，序列号的初始值是随机的，同时音频包和视频包的sequence是分别记数的。这里是2d cb(11723),则下一个rtp包的序号为2d cc(11724)</p>
</li>
<li><p>18 a8 ee f2 （时间戳 413724402）</p>
</li>
<li><p>时戳(Timestamp)：占32位，必须使用90 kHz 时钟频率。时戳反映了该RTP报文的第一个八位组的采样时刻。接收者使用时戳来计算延迟和延迟抖动，并进行同步控制。如果数据较长需要分包，则同一帧数据的时间戳相同，序号递增。</p>
</li>
<li><p>32 b8 51 db(SSRC)</p>
</li>
<li><p>同步信源(SSRC)标识符：占32位，用于标识同步信源。该标识符是随机选择的，参加同一视频会议的两个同步信源不能有相同的SSRC。</p>
</li>
<li><p>特约信源(CSRC)标识符：每个CSRC标识符占32位，可以有0～15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源。前面的CC==0,所以这里没有。</p>
</li>
</ul>
<h4 id="2、rtp-payload负载"><a href="#2、rtp-payload负载" class="headerlink" title="2、rtp payload负载:"></a>2、rtp payload负载:</h4><p>31 32 33 34 35 36 37 38 39 30 –&gt; “1234567890”</p>
<h4 id="接下来看第二组数据，复杂一点的rtp传输h264数据"><a href="#接下来看第二组数据，复杂一点的rtp传输h264数据" class="headerlink" title="接下来看第二组数据，复杂一点的rtp传输h264数据"></a>接下来看第二组数据，复杂一点的rtp传输h264数据</h4><p><img src="http://cyrus_huang.gitee.io/blog/2020/07/02/RTP详解/rtp_2.png" alt=""></p>
<h4 id="1、首先先分析-rtp-header-1"><a href="#1、首先先分析-rtp-header-1" class="headerlink" title="1、首先先分析 rtp header:"></a>1、首先先分析 rtp header:</h4><ul>
<li>80 –&gt; 10(V) 0(P) 0(X) 0000(CC) 与上面相同</li>
<li>60 –&gt; 0(M) 110 0000(PT 96)</li>
<li>4f 0a –&gt; 序列号（20234）</li>
<li>1d 38 46 c1 –&gt; 时间戳（490227393）</li>
<li>04 bb 05 85 –&gt; (SSRC)<h4 id="2、rtp-payload负载-1"><a href="#2、rtp-payload负载-1" class="headerlink" title="2、rtp payload负载:"></a>2、rtp payload负载:</h4>这里主要讲一下FU-A负载类型，其他的后面有遇到再补充：<br>FU-A类型的负载数据，首先看第一个字节，为FU indicator(如下图5)，第二个字节为FU header(如下图6）：<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/02/RTP详解/rtp_3.png" alt=""><br>这里，FU indicator是5C,即：<br>5C – &gt; 0(F) 10(NRI) 11100(Type 28FU-A 如果是29就是FU-B)</li>
</ul>
<p>FU header 是81， 即：<br>81 –&gt; 1(S start标记位，分片第一包) 0(E end标记2位，分片最后一位） 0 (R Remin 保留位，总是0） 00001（Nalu type，这里是1，表明是非IDR帧，可自行查找点64 nalu类型）</p>
<p>后面为具体的帧数据。</p>
<h4 id="3、该h264帧的其他数据帧解析"><a href="#3、该h264帧的其他数据帧解析" class="headerlink" title="3、该h264帧的其他数据帧解析"></a>3、该h264帧的其他数据帧解析</h4><p>这一帧数据分为7个rtp包，上面为第一个包，接下来我们来看一下第二个包及最后一个包，分析一下相同和差异的地方。</p>
<p>第二个包的数据为：<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/02/RTP详解/rtp_4.png" alt=""><br>rtp header，可以看到，除了序列号递增外，其它均与第一个rtp包相同:</p>
<ul>
<li>80 –&gt; 10(V) 0(P) 0(X) 0000(CC) 与第一rtp分包相同</li>
<li>60 –&gt; 0(M) 110 0000(PT 96) 与第一rtp分包相同</li>
<li>4f 0b –&gt; 序列号（20235 与第一rtp分包+1）</li>
<li>1d 38 46 c1 –&gt; 时间戳（490227393） 与第一rtp分包相同</li>
<li>04 bb 05 85 –&gt; (SSRC) 与第一rtp分包相同</li>
</ul>
<p>rtp payload负载:</p>
<ul>
<li>FU indicator是5C 与第一个分包相同</li>
<li>FU header是01 即0(S 非开始包) 0(E 非结束包） R(0) 00001(nalu type 非IdR帧）</li>
</ul>
<p>该分片的最后一个rtp包数据为：<br><img src="http://cyrus_huang.gitee.io/blog/2020/07/02/RTP详解/rtp_5.png" alt=""><br>rtp header，可以看到，除了序列号递增外，M标记位也置1了:</p>
<ul>
<li>80 –&gt; 10(V) 0(P) 0(X) 0000(CC) 与第一rtp分包相同</li>
<li>e0 –&gt; 1(M 对于视频，标记一帧结束) 110 0000(PT 96) 与第一rtp分包相同</li>
<li>4f 10 –&gt; 序列号（20240 与第一rtp分包+6，中间隔着5个包）</li>
<li>1d 38 46 c1 –&gt; 时间戳（490227393） 与第一rtp分包相同</li>
<li>04 bb 05 85 –&gt; (SSRC) 与第一rtp分包相同</li>
</ul>
<p>rtp payload负载:</p>
<ul>
<li>FU indicator是5C 与第一个分包相同</li>
<li>FU header是41 即0(S 非开始包) 1(E 结束包） R(0) 00001(nalu type 非IdR帧）</li>
</ul>
<h3 id="四、补充说明"><a href="#四、补充说明" class="headerlink" title="四、补充说明"></a>四、补充说明</h3><p>rtp header的PT 类型说明：<br><a href="https://blog.csdn.net/caoshangpa/article/details/53008018" target="_blank" rel="noopener">https://blog.csdn.net/caoshangpa/article/details/53008018</a> 可以参考这一篇</p>


                
            </div>

            <!-- Comments -->
            
                <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                    


                </div>
            
        </div>
    </div>
</article>

    <!-- Footer -->
    <hr>

<!-- Footer -->
<footer>
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <ul class="list-inline text-center">
                    

                    

                    
                        <li>
                            <a href="https://github.com/klugjo/hexo-theme-clean-blog" target="_blank">
                                <span class="fa-stack fa-lg">
                                    <i class="fa fa-circle fa-stack-2x"></i>
                                    <i class="fa fa-github fa-stack-1x fa-inverse"></i>
                                </span>
                            </a>
                        </li>
                    

                    

                    

                    
                </ul>
                <p class="copyright text-muted">&copy; 2020 Cyrus<br></p>
                <p class="copyright text-muted">Original Theme <a target="_blank" href="http://startbootstrap.com/template-overviews/clean-blog/">Clean Blog</a> from <a href="http://startbootstrap.com/" target="_blank">Start Bootstrap</a></p>
                <p class="copyright text-muted">Adapted for <a target="_blank" href="https://hexo.io/">Hexo</a> by <a href="http://www.codeblocq.com/" target="_blank">Jonathan Klughertz</a></p>
                <p class="copyright text-muted"><a href="http://www.beian.miit.gov.cn">粤ICP备18110122号-1</a></p>
            </div>
        </div>
    </div>
</footer>


    <!-- After footer scripts -->
    
<!-- jQuery -->
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>

<!-- Bootstrap -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<!-- Gallery -->
<script src="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.js" type="text/javascript" charset="utf-8"></script>

<!-- Disqus Comments -->



</body>

</html>